﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace LOGIC
{
    ///Logisk klass för hantering av budgetering samt statistikfunktioner
    public class LogicBudget
    {
        public LogicBudget()
        { }

        private DB.Intäkt income;

        public LogicBudget(DB.Intäkt dbBudg)
        {
            this.income = dbBudg;
        }

        private LogicSession session;
        public LogicBudget(LogicSession session)
        {
            this.session = session;
        }

        //Get metoder
        #region

        public int År
        {
            get { return income.år; }
        }

        public int Vecka
        {
            get { return income.vecka; }
        }

        public string Typ
        {
            get { return income.typ; }
        }

        public int Budget
        {
            get { return (int)income.budgIntäkt; }
        }

        public int ProgIncome
        {
            get { return (int)income.progIntäkt; }
        }

        public int Beläggningsgrad
        {
            get { return (int)income.beläggningsgrad; }
        }
        #endregion

        //********************************************************************************** Budget Metoder *********************************************************************************//

        /// <summary>
        /// Metod som söker ut innevarande vecka för att skriva ut denna vecka  som förvald i comboBox
        /// </summary>
        /// <param name="date">Dagens datum</param>
        /// <returns></returns>
        public int GetWeekFromDate(DateTime date)
        {
            CultureInfo culture = new CultureInfo("sv-SE");
            int week= culture.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday);
            return week;
        }

        /// <summary>
        /// Metod som kontrollerar om budget finns för det specifika år och vecka som angivits.
        /// </summary>
        /// <param name="tempYear">År</param>
        /// <param name="tempWeek">Vecka</param>
        /// <returns></returns>
        public bool CheckBudgetYearAndWeek(int tempYear, int tempWeek)
        {
            return LogicSession.TheSession.Db.CheckBudgetYearAndWeek(tempYear, tempWeek);
        }

        /// <summary>
        /// Metod som skapar en ny instans för att kunna sätta budget för specifikt år, vecka och typ av logi eller konferens.
        /// </summary>
        /// <param name="year">År</param>
        /// <param name="week">Vecka</param>
        /// <param name="type">'Logi eller konferenstyp</param>
        /// <returns></returns>
        public static LogicBudget Newbudget(int year, int week, string type)
        {
            return new LogicBudget(LogicSession.TheSession.Db.NewBudget(year, week, type));
        }

        /// <summary>
        /// Metod som hämtar in budget för valt år, vecka 
        /// </summary>
        /// <param name="tempYear">År</param>
        /// <param name="tempWeek">Vecka</param>
        /// <returns></returns>
        public IQueryable GetBudgetByYearAndWeek(int tempYear, int tempWeek)
        {
            return LogicSession.TheSession.Db.GetBudgetByYearAndWeek(tempYear, tempWeek); 
        }

        /// <summary>
        /// Metod som ändrar budget för valt år, vecka och typ av logi eller konferens. 
        /// </summary>
        /// <param name="tempYear">År</param>
        /// <param name="tempWeek">Vecka</param>
        /// <param name="tempType">Typ av Logi eller Konferens</param>
        /// <param name="tempBudg">Nytt budgetbelopp</param>
        public static void ChangeBudget(int tempYear, int tempWeek, string tempType, int tempBudg)
        {
            LogicSession.TheSession.Db.ChangedBudget(tempYear, tempWeek, tempType, tempBudg);
        }


    //********************************************************************************* Statistik Metoder ********************************************************************************//

        /// <summary>
        /// Metod som söker ut och sätter beläggningsgrad för valt år, vecka/veckor samt logityp.
        /// </summary>
        /// <param name="fromWeek">Från vecka</param>
        /// <param name="toWeek">Till vecka</param>
        /// <param name="tempYear">År</param>
        /// <param name="tempType">Typ av logi </param>
        public static void SetOccupancyLevelLodging(int fromWeek, int toWeek, int tempYear, string tempType)
        {
            int countWeeks = fromWeek;
            while (countWeeks <= toWeek)//Går igenom varje vecka inom intervallet
            {
                LogicSession.TheSession.Db.SetOccupancylevelLodging(tempYear, countWeeks, tempType);
                countWeeks += 1;
            }
        }

        /// <summary>
        /// Metod som söker ut och sätter beläggningsgrad för valt år, vecka/veckor samt konferenstyp
        /// </summary>
        /// <param name="fromWeek">Från vecka</param>
        /// <param name="toWeek">Till vecka</param>
        /// <param name="tempYear">År</param>
        /// <param name="tempType">Typ av konferens</param>
        public static void SetOccupancyLevelConference(int fromWeek, int toWeek, int tempYear, string tempType)
        {
            int countWeeks = fromWeek;
            while (countWeeks <= toWeek)// Går igenom varje vecka inom intervallet
            {
                LogicSession.TheSession.Db.SetOccupancylevelConference(tempYear, countWeeks, tempType);
                countWeeks += 1;
            }
        }

        /// <summary>
        /// Metod som hämtar in beläggningsgrad för valda veckor, år och typ.
        /// </summary>
        /// <param name="fromWeek">Från vecka</param>
        /// <param name="toWeek">Till vecka</param>
        /// <param name="tempYear">År</param>
        /// <param name="tempType">Typ av konferens eller logi</param>
        /// <returns></returns>
        public IQueryable GetOccupancyLevel(int fromWeek, int toWeek, int tempYear, string tempType)
        {
             return LogicSession.TheSession.Db.GetOccupancyLevel(tempYear, fromWeek, toWeek, tempType);
        }

        /// <summary>
        /// Metod som hämtar in beläggningsgrad för vintersäsongen
        /// </summary>
        /// <param name="fromWeek">Från vecka</param>
        /// <param name="toWeek">Till vecka</param>
        /// <param name="tempYear">År</param>
        /// <param name="tempType">Typ av logi eller konferens</param>
        /// <returns></returns>
        public IQueryable GetOccupancyLevelWinter(int fromWeek, int toWeek, int tempYear, string tempType)
        {
            return LogicSession.TheSession.Db.GetOccupancyLevelWinter(tempYear, fromWeek, toWeek, tempType);
        }

    }
}
